package process_demo.singleton;

/**
 * @author haomin
 * @date 2022/04/25 19:18
 **/
public class LazyModeV3 {
    // volatile 用它声明的类型变量表示不可以被某些编译器未知的因素更改
    private volatile static LazyModeV3 instance = null;

    public static LazyModeV3 getInstance() {
        // 第一次调用这个方法时，说明我们应该实例化对象了
        if (instance == null) {
            synchronized (LazyModeV3.class) {
                // 加锁之后才能执行
                // 第一个抢到锁的线程看instance 是 null
                // 其他第一个抢到锁的线程看instance 是 null
                // 保证instance 只实例化一次
                if (instance == null) {
                    instance = new LazyModeV3();    // 只在第一次的时候执行
                }
            }
        }

        return instance;
    }
}